package com.main.controller;


import java.io.File;
import java.net.URL;
import java.net.URLDecoder;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.util.JRLoader;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.service.jdbc.connections.spi.ConnectionProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.generico.exception.AsiWebException;
import com.web.util.GenericoUtil;

@Controller
@RequestMapping("/reportes")
public class ResportesAlfinteController extends BaseController{

	@Autowired
	private SessionFactory sessionFactory;

	private Session openSession() {
		return sessionFactory.getCurrentSession();
	}
	
	@SuppressWarnings("deprecation")
	@RequestMapping(value = "/generarReportePdf")
	public void generarReportePdf(HttpServletRequest request,HttpServletResponse response, ModelMap model
			/**, @ModelAttribute("parametros") ParametrosReportes parametros**/
			,@RequestParam(value = "nombreReporte") String nombreReporte
			,@RequestParam(value = "usuarioId") Long usuarioId
			) throws JRException, AsiWebException {
		
		ServletOutputStream out;
		File fichero = getUrlFile(nombreReporte);
		Map<String, Object> parameters = getParametros(nombreReporte, usuarioId);
		JasperReport jasperReport = (JasperReport) JRLoader.loadObject(fichero);
        Connection con = null;
        
        
        Properties properties = GenericoUtil.getPropertiesFile(GenericoUtil.GEN_WEB_PROPERTIES);
		String jdbcUrl = properties.getProperty("jdbc.url");
		String jdbcUsername = properties.getProperty("jdbc.username");
		String jdbcPassword = properties.getProperty("jdbc.password");
		String jdbcDriver = properties.getProperty("jdbc.driverClassName");
	    
		try {
			Class.forName(jdbcDriver).newInstance();
			con = DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword);
			byte[] filePdf = JasperRunManager.runReportToPdf(jasperReport,parameters,con);
			response.setContentType("application/pdf");
			response.setHeader("Cache-Control", "max-age=30");
			response.setHeader("Pragma", "No-cache");
			response.setDateHeader("Expires", 0);
			response.setContentLength(filePdf.length);
			out = response.getOutputStream();
			out.write(filePdf, 0, filePdf.length);
			out.flush();
			out.close();
		} catch (Exception e) {
			logger.info(e.getMessage());
		}finally {
			if(con!=null){
				try {
					con.close();
				} catch (SQLException e) {
					logger.info(e.getMessage());
				}
			}
		}

	}
	
	public Map<String, Object> getParametros(String nombreReporte, Long usuarioId) throws AsiWebException {
		String fecha = GenericoUtil.dateFormatAsDD_MM_YYYY___HH_MM_A.format(new Date());
        String usuarioLogeado = GenericoUtil.getUserName();
		Map<String, Object> parameters = new HashMap<String, Object>();
		
		if (nombreReporte.equals("Ventas(EJEMPLO)")) {
			parameters.put("USULOGEADO",usuarioLogeado);
			parameters.put("FECHA",fecha);
		} else if (nombreReporte.equals("reportePrueba")) {
			parameters.put("USULOGEADO",usuarioLogeado);
			parameters.put("FECHA",fecha);
		} else if (nombreReporte.equals("reporteMio")) {
			parameters.put("ESTADO","1");
		} else if (nombreReporte.equals("reporteHistorialCliente")) {
			parameters.put("USUARIO_ID",(GenericoUtil.getSgdUsuarioIdFromAcegi()));
			parameters.put("FECHA",fecha);
		} else if (nombreReporte.equals("reporteAsignacionTarea")) {
			parameters.put("INSTALADORID",GenericoUtil.getSgdUsuarioIdFromAcegi());
			parameters.put("USUARIO_ID",GenericoUtil.getUserName());
			parameters.put("FECHA",fecha);
		} else if (nombreReporte.equals("reporteOrdenTrabajo")) {
			parameters.put("USUARIO_ID",GenericoUtil.getUserName());
			parameters.put("FECHA",fecha);
			parameters.put("PEDIDO_ID",usuarioId);
		} else if (nombreReporte.equals("reporteInventario")) {
			parameters.put("USUARIO_ID",GenericoUtil.getUserName());
			parameters.put("FECHA",fecha);
		} else if (nombreReporte.equals("reporteAsignacionTarea")) {
			parameters.put("USUARIO_ID",GenericoUtil.getUserName());
			parameters.put("FECHA",fecha);
		} else if (nombreReporte.equals("reporteDeVentas")) {
			parameters.put("USUARIO_ID",GenericoUtil.getUserName());
			parameters.put("FECHA",fecha);
			parameters.put("SUCURSAL_ID",GenericoUtil.getCtgSucursalIdFromAcegi());
		} else if (nombreReporte.equals("reporteRequisicionesAutorizadas")) {
			parameters.put("USUARIO_ID",GenericoUtil.getUserName());
			parameters.put("FECHA",fecha);
		} else if (nombreReporte.equals("resumenDeVentas")) {
			parameters.put("USUARIO_ID",GenericoUtil.getSgdUsuarioIdFromAcegi());
			parameters.put("SUCURSAL_ID",GenericoUtil.getCtgSucursalIdFromAcegi());
		}else if (nombreReporte.equals("ventasPorPeriodo1")) {
			parameters.put("USUARIO",GenericoUtil.getUserName());
			parameters.put("FECHA",fecha);
			parameters.put("SUCURSAL_ID",GenericoUtil.getCtgSucursalIdFromAcegi());
		}
		
		
		logger.info(parameters);
		return parameters;
	}
	
	public File getUrlFile(String nombreReporte) {
		File folder = null;
		URL url = null;
		String jasperPathLocation = "";
		if(nombreReporte.equals("ventas(EJEMPLO)")){
			jasperPathLocation = "/reportes/usuario.jasper";
		} else if (nombreReporte.equals("reportePrueba")) {
			jasperPathLocation = "/reportes/reportePrueba.jasper";
		}
		else if (nombreReporte.equals("reporteMio")) {
			jasperPathLocation = "/reportes/report1.jasper";
		}
		else if (nombreReporte.equals("reporteHistorialCliente")) {
			jasperPathLocation = "/reportes/historial_cliente.jasper";
		}
		else if (nombreReporte.equals("reporteInventario")) {
			jasperPathLocation = "/reportes/inventario.jasper";
		}
		else if (nombreReporte.equals("reporteAsignacionTarea")) {
			jasperPathLocation = "/reportes/asignacionTarea.jasper";
		}
		else if (nombreReporte.equals("reporteOrdenTrabajo")) {
			jasperPathLocation = "/reportes/ordenTrabajo.jasper";
		}
		else if (nombreReporte.equals("reporteDeVentas")) {
			jasperPathLocation = "/reportes/reporteVentas.jasper";
		}
		else if (nombreReporte.equals("reporteRequisicionesAutorizadas")) {
			jasperPathLocation = "/reportes/requisicionesAutorizadas.jasper";
		}
		else if (nombreReporte.equals("resumenDeVentas")) {
			jasperPathLocation = "/reportes/reporteVentasBI.jasper";
		}
		else if (nombreReporte.equals("ventasPeriodo")) {
			jasperPathLocation = "/reportes/ventasperiodo.jasper";
		}
		else if (nombreReporte.equals("ventasPorPeriodo1")) {
			jasperPathLocation = "/reportes/porfa.jasper";
		}
		
		
		try {
			url = Thread.currentThread().getContextClassLoader().getResource(jasperPathLocation);
			folder = new File(URLDecoder.decode(url.getPath(), "UTF-8"));
		} catch (Exception e) {
			logger.error("Error leyendo directorio: " + e.getMessage(), e);
		}
		return folder;
	}
	
	
	
	
	
	
	
}
